/**
 * \file packet_icmp.c
 * \brief Packet ICMP
 * \author Pierre Neumann / Julien Meutelet
 * \version 0.1
 * \date 20 decembre 2013
 *
 * Sert à Initialiser un paquet ICMP ECHO et afficher l'entête ICMP
 *
 */
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <netinet/in.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h> 
#include <netinet/ip_icmp.h> 
#include <arpa/inet.h>

#include "packet_utils.h"
#include "packet_ip.h"
#include "packet_icmp.h"

const size_t ICMP_HEADER_SIZE = sizeof(struct icmp); /*!< Taille de l'entête ICMP */
const size_t ICMP_PACKET_SIZE = sizeof(struct ip) + sizeof(struct icmp); /*!< Taille d'un paquet ICMP */
const int ICMP_PROTOCOL_NUMBER = 1; /*!< Numéro du protocole ICMP */

/**
 * \fn init_icmp_header(char** packet, struct in_addr* destination, struct in_addr* source, int ttl)
 * \brief Initialise un paquet ICMP ECHO
 *
 * \param packet Chaine de caractère représentant le paquet ICMP.
 * \param destination Pointeur vers la structure in_addr de la destination.
 * \param source Pointeur vers la structure in_addr de la source.
 * \param ttl Entier utilisé pour initialiser le champ ttl de l'entête IP.
 * \return Rien.
 */
void init_icmp_header(char** packet, struct in_addr* destination, struct in_addr* source, int ttl){
	// On alloue la taille d'un paquet ICMP
	*packet = (char *) malloc(ICMP_PACKET_SIZE);  

	// Initialisation de l'entête IP
	init_ip_header(packet,destination,source,ICMP_HEADER_SIZE,ICMP_PROTOCOL_NUMBER,ttl);

	// On complète les champs de l'entête ICMP
	struct icmp *hicmp; 
	hicmp = (struct icmp *) (*packet + IP_HEADER_SIZE); 
	hicmp->icmp_type = ICMP_ECHO; 
	hicmp->icmp_code = 0; 
	hicmp->icmp_cksum = 0; 
	hicmp->icmp_cksum = checksum((unsigned short *)hicmp,ICMP_HEADER_SIZE);
}

/**
 * \fn print_icmp_header(char** packet)
 * \brief Affiche l'entête ICMP d'un paquet
 *
 * \param packet Chaine de caractère représentant le paquet ICMP.
 * \return Rien.
 */
void print_icmp_header(char** packet){
	struct icmp *hicmp = (struct icmp *) (*packet + IP_HEADER_SIZE); 
	printf("------Entête ICMP------\n");
	printf("Type : %d\n",hicmp->icmp_type);
	printf("Code : %d\n",hicmp->icmp_code);
	printf("Checksum : %d\n",hicmp->icmp_cksum);
}
